package com.atty.dms.service;

import com.atty.dms.dao.entity.UserDO;
import com.atty.dms.dto.req.UserLoginReqDTO;
import com.atty.dms.dto.req.UserRegisterReqDTO;
import com.atty.dms.dto.req.UserUpdateReqDTO;
import com.atty.dms.dto.resp.UserLoginRespDTO;
import com.atty.dms.dto.resp.UserRespDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * ClassName:UserService
 * Package:com.atty.dms.service
 * Description:
 *
 * @Author:tony
 * @Create :2025/4/6 16:01
 * @Version :1.0
 */

public interface UserService extends IService<UserDO> {

    /**
     * 根据用户名查询用户信息
     * @param username 用户名
     * @return 用户返回实体
     */
    UserRespDTO getUserByUsername(String username);

    /**
     * 根据用户id查询用户信息
     * @param userId
     * @return
     */
    UserRespDTO getUserByUserId(Long userId);

    /**
     * 判断用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean hasUsername(String username);

    /**
     * 注册用户
     * @param requestParam 注册请求
     */
    void register(UserRegisterReqDTO requestParam);

    /**
     * 根据用户名修改用户信息
     * @param requestParam 修改用户请求参数
     * @return
     */
    int update(UserUpdateReqDTO requestParam);

    /**
     * 用户登录
     * @param requestParam 用户登录请求参数
     * @return  用户登录返回参数
     */
    UserLoginRespDTO login(UserLoginReqDTO requestParam);


    /**
     *  检查用户登录状态
     *  @param username 用户名
     * @param token 用户登录token
     * @return  用户是否登录标识
     */
    Boolean checkLogin(String username, String token);


    /**
     *  退出登录
     * @param username
     * @param token
     */
    void logout(String username, String token);

    /**
     * 分页查询所有用户
     * @param pageNum
     * @param pageSize
     * @return 用户分页信息
     */
    Page<UserRespDTO>  getAllUsersByPage(int pageNum, int pageSize);

    /**
     * 根据id集合查询用户信息
     * @param studentIds
     * @return
     */
    List<UserDO> getUsersByIds(List<Long> studentIds);

    /**
     * 根据性别和未分配宿舍分页查询用户信息
     * @param pageNum
     * @param pageSize
     * @param gender
     * @return
     */
    Page<UserRespDTO> getAllUsersByGenderAndNotInDormitoryByPage(int pageNum, int pageSize, Integer gender);

}
